package com.yt.system.service.impl;

import com.yt.system.dao.QuestionsMapper;
import com.yt.system.dao.UserMapper;
import com.yt.system.domain.*;
import com.yt.system.service.QuestionsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author 高铭
 * @date 2019/9/22 - 14:45
 *
 */
@Service
public class QuestionsServiceImpl implements QuestionsService {

    @Autowired
    private QuestionsMapper questionsMapper;
    @Autowired
    UserMapper userMapper;

    /**
     * 随机抽出10道已经创建好的评价问卷，让组员相互评价，顺带将当前用户所在小组的其余人员信息返回，进行人员评分
     * @return
     */
    @Override
    public JsonRootBean getQuestion() {
        JsonRootBean jsonRootBean = new JsonRootBean();
        //随机抽取数据库10道360评价的题目
        ArrayList<Questions> questionsList = questionsMapper.getQuestion();
        //创建一个根据qid轮流拿到题目选项分值的存储集合
        ArrayList<QuestionContentValue> qcvList = new ArrayList<>();
        //创建QuestionContentValue 对象
        QuestionContentValue qcv;
        for (Questions questions : questionsList) {
            qcv = questionsMapper.findQuestionContentValueByQid(questions.getQid());
            qcvList.add(qcv);
        }
        //创建一个list集合，添加所有题目的所有内容
        List<Mydata> myDataList = new ArrayList<>();
        int index = questionsList.size();
        for (int i = 0 ; i < index ; i++) {
            //创建一个map集合去收集题目以及选项+选项的分数
            Questions questions = questionsList.get(i);
            //创建题目的对象（包含题目、选项+选项分值）
            Mydata mydata = new Mydata();
            mydata.setId(i + 1);
            //创建选项+选项分值的对象
            //创建一道题目的选项集合
            List<MyScore> myScoreList = new ArrayList<>();
            MyScore myScoreA = new MyScore();
            mydata.setQuestion(questions.getQuestion());
            //得到选线A的内容
            myScoreA.setLabel(questions.getContenta());
            //得到选项A的分值
            myScoreA.setValue((qcvList.get(i).getAvalue()).toString());
            myScoreList.add(myScoreA);
            MyScore myScoreB = new MyScore();
            //得到选线B的内容
            myScoreB.setLabel(questions.getContentb());
            //得到选项B的分值
            myScoreB.setValue((qcvList.get(i).getBvalue()).toString());
            myScoreList.add(myScoreB);
            /**
             * 问卷一般最低有A B两个选项内容，所以AB两个选项内容的值是否为空我就不判断了
             */
            //判断选项c是否有内容
            if(questions.getContentc() != null){
                MyScore myScoreC = new MyScore();
                //得到选线C的内容
                myScoreC.setLabel(questions.getContentc());
                //得到选项C的分值
                myScoreC.setValue((qcvList.get(i).getCvalue()).toString());
                myScoreList.add(myScoreC);
            }
            //判断选项d是否有内容
            if(questions.getContentd() != null){
                MyScore myScoreD = new MyScore();
                //得到选线D的内容
                myScoreD.setLabel(questions.getContentd());
                //得到选项D的分值
                myScoreD.setValue((qcvList.get(i).getDvalue()).toString());
                myScoreList.add(myScoreD);
            }
            //判断选项e是否有内容
            if(questions.getContente() != null){
                MyScore myScoreE = new MyScore();
                //得到选线A的内容
                myScoreE.setLabel(questions.getContente());
                //得到选项A的分值
                myScoreE.setValue((qcvList.get(i).getEvalue()).toString());
                myScoreList.add(myScoreE);
            }
            mydata.setScore(myScoreList);
            //将一道题目的题目+选项+选项的分值添加到集合中
            myDataList.add(mydata);
            jsonRootBean.setMydata(myDataList);
        }
        return jsonRootBean;
    }

    /**
     * 管理员添加问卷
     * @param myData
     */
    @Override
    public void adminInsertQuestions(JsonRootBean myData) {
        //创建题目对象
        Questions questions = new Questions();
        //创建选项分值对象
        QuestionContentValue questionContentValue = new QuestionContentValue();
        List<Mydata> mydata = myData.getMydata();
        for (Mydata myquestion : mydata) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            /*System.out.println("===="+myquestion.getQuestion());*/
            questions.setQuestion(myquestion.getQuestion());
            List<MyScore> score = myquestion.getScore();
            for(int i = 0 ; i < score.size() ; i++){
                /*System.out.println("label:  "+score.get(i).getLabel() + "  value:"+score.get(i).getValue());*/
                if( i == 0){
                    //为创建题目添加时间
                    questions.setCreatetime(sdf.format(new Date()));
                    //为题目设置选项A内容
                    questions.setContenta(score.get(i).getLabel());
                    //为这道题目的选项A设置分值
                    questionContentValue.setAvalue(Integer.parseInt(score.get(i).getValue()));
                }
                if( i == 1){
                    //为题目设置选项B内容
                    questions.setContentb(score.get(i).getLabel());
                    //为这道题目的选项B设置分值
                    questionContentValue.setBvalue(Integer.parseInt(score.get(i).getValue()));
                }
                if( i == 2){
                    //为题目设置选项C内容
                    questions.setContentc(score.get(i).getLabel());
                    //为这道题目的选项C设置分值
                    questionContentValue.setCvalue(Integer.parseInt(score.get(i).getValue()));
                }
                if( i == 3){
                    //为题目设置选项D内容
                    questions.setContentd(score.get(i).getLabel());
                    //为这道题目的选项D设置分值
                    questionContentValue.setDvalue(Integer.parseInt(score.get(i).getValue()));
                }
                if( i == 4){
                    //为题目设置选项E内容
                    questions.setContente(score.get(i).getLabel());
                    //为这道题目的选项E设置分值
                    questionContentValue.setEvalue(Integer.parseInt(score.get(i).getValue()));
                }
            }
            /**
             * 将题目和分值存进数据库
             * @param questions
             */
            int qid = questionsMapper.insertQuestions(questions);
            /**
             * 将题目的选项分值存进数据库,
             *      并将最新的题目id返回，和题目的选项分值相对应绑定
             */
            questionContentValue.setQid(questions.getQid());
            questionsMapper.insertQuestionContentValue(questionContentValue);
        }
    }

    @Override
    public void insertGroupScore(List<Sorttable> data) {
        Sorttable stable = data.get(0);
        for (Sorttable sorttable : data) {
            //先查询这个用户的评分对象是否存在
            Sorttable st = questionsMapper.findByUid(sorttable.getUid());
            if(st == null){
                //如果这个为空，说明还没评分，这时候要插入一条评分的数据
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                sorttable.setSorttime(sdf.format(new Date()));
                questionsMapper.insertGroupPeopleScore(sorttable);
            }else{
                //如果不为空，则拿评分按照用户的uid去修改数据库
                questionsMapper.updateGroupPeopleScore(st.getUid(),sorttable.getScore());
            }
        }
        //修改最后一名人员的评分
        updTheLastSortedUserScore(stable.getGid());
    }

    @Override
    public LinkedList<SortedUser> getTheGroupSortedPeople(Integer gid,String sortTime) {
        return questionsMapper.getTheGroupSortedPeople(gid,sortTime);
    }

    /**
     * @description 系统读取每一个组的排名情况，如果该用户为组长，
     * 且组内排名不是最后一名，则本周评分×2，若为组内最后一名，则本周评分不变，；
     * 如果该用户为组员且组内排名为最后一名，则本周评分÷2，否则本周评分不变
     * @author 高铭
     * @Date   2019/9/30 - 12:22
     * @Param  [gid]
     * @return void
     */
    @Override
    public void updTheLastSortedUserScore(Integer gid) {
        //根据gid查询这个组的组长
        UserRole groupLeader = questionsMapper.getThgroupLeader(gid);
        //根据组gid拿到这个组的  最后一名    用户的uid
        Integer theLastSortedUserOfId = questionsMapper.getTheLastSortedUserOfId(gid);
        if(groupLeader != null){
            //如果有组长，判断组长是否是最后一名
            if(groupLeader.getAid().equals(theLastSortedUserOfId)){
                //组长是最后一名，则扣分 总分 / 2
                questionsMapper.updateGroupLeaderLowScore(theLastSortedUserOfId);
            }else{
                //组长不是最后一名，则组长的总分 * 2
                questionsMapper.updateGroupLeaderUpScore(groupLeader.getAid());
            }
        }else{
            //最后一名不是组长，则将最后一名的这个人的总分 / 2
            questionsMapper.updateGroupLastUserLowScore(theLastSortedUserOfId);
        }
    }
}
